#include "RegistroCubeta.h"
using namespace Hash;

/**
 * Inicializa el registro con clave vacia y vector de offsets vacio
**/
RegistroCubeta::RegistroCubeta() {
	this->setClave("");
	this->setOffsets(new vector<unsigned int>);
}

/**
 * Inicializa el registro con una clave y un solo offset
**/
RegistroCubeta::RegistroCubeta(string clave, unsigned int offset) {
  this->setClave(clave);
  this->offsets = new vector<unsigned int>();
  this->getOffsets()->push_back(offset);
}

/*
 * constructor de copia
 */
RegistroCubeta::RegistroCubeta(const RegistroCubeta& registroCubeta) {
	this->clave = registroCubeta.getClavePorCopia();
	this->offsets = new vector<unsigned int> ;
	for (unsigned int i = 0; i < registroCubeta.getOffsetsPorCopia()->size(); i++) {
		this->getOffsets()->push_back(registroCubeta.getOffsetsPorCopia()->at(i));
	}
}

vector<unsigned int>* RegistroCubeta::getOffsets()
{
    return this->offsets;
}

string RegistroCubeta::getClave()
{
    return this->clave;
}

void RegistroCubeta::setOffsets(vector<unsigned int>* offsets)
{
    this->offsets = offsets;
}

void RegistroCubeta::setClave(string clave)
{
    this->clave = clave;
}

string RegistroCubeta::getClavePorCopia() const{
    return this->clave;
}

vector<unsigned int>* RegistroCubeta::getOffsetsPorCopia() const{
    return this->offsets;
}

/**
 * Devuelve la cantidad de Bytes ocupados por el registro contando su metadata
**/
int RegistroCubeta::getBytesOcupados(){
  //longitud de los offset, longitud de la clave, metada offset y clave
  return (this->getOffsets()->size()*sizeof(int)) + this->getClave().size() + (sizeof(int)*2);

}

/* Agrega un nuevo offset al registro
 * Si el offset no estaba lo inserta, sino no hace nada
 */
bool RegistroCubeta::insertar(unsigned int offset){

  if (this->buscar(offset) == -1){
    this->offsets->push_back(offset);
    return true;
  }
  return false;
}

/* Elimina un offset del registro
 * Si el offset estaba lo borra, sino no hace nada
 */
bool RegistroCubeta::eliminar(unsigned int offset){

  int posicion  = this->buscar(offset);
  if (posicion != -1){
    this->offsets->erase(this->offsets->begin()+posicion);
    return true;
  }
  return false;
}

/**
 * Busca un offsett en el vector del registro
 * - si lo encuentra devuelve la posicion en el vector
 * - si no lo encuentra devuelve -1
**/
int RegistroCubeta::buscar(unsigned int offset){
  for (unsigned int i = 0; i<this->getOffsets()->size();i++){
    if (this->getOffsets()->at(i)== offset){
      return i;
    }
  }
    return -1;
}

/**
 * Libera la memoria del registro
**/
RegistroCubeta::~RegistroCubeta() {
  delete this->offsets;
}
